Pythonã®æ¥ç¶ããŒãªã³ã°ã§æé©ãªããŒã¿ããŒã¹ããã©ãŒãã³ã¹ãå®çŸãå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®æ§ã ãªæŠç¥ãå©ç¹ãå®è·µçãªå®è£ äŸãæ¢ããŸãã
PythonããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ïŒããã©ãŒãã³ã¹åäžã®ããã®æ¥ç¶ç®¡çæŠç¥
çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠãããŒã¿ããŒã¹ãšã®å¯Ÿè©±ã¯åºæ¬çãªèŠä»¶ã§ãããããããªã¯ãšã¹ãããšã«ããŒã¿ããŒã¹æ¥ç¶ã確ç«ããããšã¯ãç¹ã«é«ãã©ãã£ãã¯ç°å¢ã§ã¯é倧ãªããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãåŸãŸããPythonã®ããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ã¯ãããã«äœ¿çšã§ããæ¥ç¶ã®ããŒã«ãç¶æããããšã§ãã®åé¡ã«å¯ŸåŠããæ¥ç¶ã®äœæãšåæã®ãªãŒããŒããããæå°éã«æããŸãããã®èšäºã§ã¯ãPythonã®ããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ã«ã€ããŠããã®å©ç¹ãæ§ã ãªæŠç¥ãå®è·µçãªå®è£ äŸãæ¢ããªãããå æ¬çãªã¬ã€ããæäŸããŸãã
æ¥ç¶ããŒãªã³ã°ã®å¿ èŠæ§ãçè§£ãã
ããŒã¿ããŒã¹æ¥ç¶ã®ç¢ºç«ã«ã¯ããããã¯ãŒã¯éä¿¡ãèªèšŒããªãœãŒã¹å²ãåœãŠãªã©ãããã€ãã®ã¹ããããå«ãŸããŸãããããã®ã¹ãããã¯æéãšãªãœãŒã¹ãæ¶è²»ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸãã倿°ã®ãªã¯ãšã¹ããããŒã¿ããŒã¹ã¢ã¯ã»ã¹ãå¿ èŠãšããå Žåãæ¥ç¶ã®äœæãšã¯ããŒãºãç¹°ãè¿ãããšã«ãã环ç©çãªãªãŒããŒãããã¯çžåœãªãã®ã«ãªããã¬ã€ãã³ã·ã®å¢å ãšã¹ã«ãŒãããã®äœäžã«ã€ãªãããŸãã
æ¥ç¶ããŒãªã³ã°ã¯ãäºåã«ç¢ºç«ãããããã«äœ¿çšã§ããããŒã¿ããŒã¹æ¥ç¶ã®ããŒã«ãäœæããããšã§ããã®åé¡ã«å¯ŸåŠããŸããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ãšå¯Ÿè©±ããå¿ èŠãããå ŽåãããŒã«ããæ¥ç¶ãåããã ãã§ããæäœãå®äºãããšãæ¥ç¶ã¯ä»ã®ãªã¯ãšã¹ãã«ããåå©çšã®ããã«ããŒã«ã«è¿åŽãããŸãããã®ã¢ãããŒãã«ãããæ¥ç¶ãç¹°ãè¿ã確ç«ããã³ã¯ããŒãºããå¿ èŠããªããªããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãå€§å¹ ã«åäžããŸãã
æ¥ç¶ããŒãªã³ã°ã®å©ç¹
- æ¥ç¶ãªãŒããŒãããã®åæžïŒ æ¥ç¶ããŒãªã³ã°ã¯ãåãªã¯ãšã¹ãããšã«ããŒã¿ããŒã¹æ¥ç¶ã確ç«ã»åæãããªãŒããŒããããæé€ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ æ¢åã®æ¥ç¶ãåå©çšããããšã§ãæ¥ç¶ããŒãªã³ã°ã¯ã¬ã€ãã³ã·ãåæžããã¢ããªã±ãŒã·ã§ã³ã®å¿çæéãæ¹åããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åŒ·åïŒ æ¥ç¶ããŒãªã³ã°ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ããŒã¹æ¥ç¶ã®ããã«ããã¯ã«å¶éãããããšãªããããå€ãã®åæãªã¯ãšã¹ããåŠçã§ããŸãã
- ãªãœãŒã¹ç®¡çïŒ æ¥ç¶ããŒãªã³ã°ã¯ãã¢ã¯ãã£ããªæ¥ç¶æ°ãå¶éããããšã§ãããŒã¿ããŒã¹ãªãœãŒã¹ãå¹ççã«ç®¡çããã®ã«åœ¹ç«ã¡ãŸãã
- ã³ãŒãã®ç°¡çŽ åïŒ æ¥ç¶ããŒãªã³ã°ã¯ãæ¥ç¶ç®¡çã®è€éããæœè±¡åããããšã§ãããŒã¿ããŒã¹ãšã®å¯Ÿè©±ã³ãŒããç°¡çŽ åããŸãã
æ¥ç¶ããŒãªã³ã°æŠç¥
Pythonã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã€ãã®æ¥ç¶ããŒãªã³ã°æŠç¥ãæ¡çšã§ããŸããããããã«é·æãšçæããããŸããæŠç¥ã®éžæã¯ãã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ãããŒã¿ããŒã¹ãµãŒããŒã®èœåãããã³åºç€ãšãªãããŒã¿ããŒã¹ãã©ã€ããŒãªã©ã®èŠå ã«äŸåããŸãã
1. éçæ¥ç¶ããŒãªã³ã°
éçæ¥ç¶ããŒãªã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«åºå®æ°ã®æ¥ç¶ãäœæããã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ãã¿ã€ã ãéããŠããããç¶æããŸãããã®ã¢ãããŒãã¯å®è£ ãç°¡åã§ãäºæž¬å¯èœãªããã©ãŒãã³ã¹ãæäŸããŸããããããæ¥ç¶æ°ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ãŒã¯ããŒãã«é©åã«èª¿æŽãããŠããªãå Žåãéå¹çã«ãªãå¯èœæ§ããããŸããããŒã«ãµã€ãºãå°ãããããšããªã¯ãšã¹ãã¯å©çšå¯èœãªæ¥ç¶ãåŸ ããªããã°ãªããªãå ŽåããããŸããããŒã«ãµã€ãºã倧ãããããšãããŒã¿ããŒã¹ãªãœãŒã¹ã浪費ããå¯èœæ§ããããŸãã
äŸïŒSQLAlchemyã䜿çšïŒïŒ
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a database engine with a fixed pool size
engine = create_engine(database_url, pool_size=10, max_overflow=0)
# Create a session factory
Session = sessionmaker(bind=engine)
# Use a session to interact with the database
with Session() as session:
# Perform database operations
pass
ãã®äŸã§ã¯ã`pool_size`ã¯ããŒã«å ã«äœæãããæ¥ç¶æ°ãæå®ãã`max_overflow`ã¯ããŒã«ãæ¯æžããå Žåã«äœæã§ãã远å ã®æ¥ç¶æ°ãæå®ããŸãã`max_overflow`ã0ã«èšå®ãããšãåæããŒã«ãµã€ãºãè¶ ãã远å ã®æ¥ç¶ã®äœæãé²ãããŸãã
2. åçæ¥ç¶ããŒãªã³ã°
åçæ¥ç¶ããŒãªã³ã°ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ãŒã¯ããŒãã«åºã¥ããŠããŒã«å ã®æ¥ç¶æ°ãåçã«å¢æžãããããšãã§ããŸãããã®ã¢ãããŒãã¯éçæ¥ç¶ããŒãªã³ã°ãããæè»ã§ãå€åãããã©ãã£ãã¯ãã¿ãŒã³ã«é©å¿ã§ããŸããããããããé«åºŠãªç®¡çãå¿ èŠã§ãããæ¥ç¶ã®äœæãšåæã«å€å°ã®ãªãŒããŒããããçããå¯èœæ§ããããŸãã
äŸïŒSQLAlchemyã§QueuePoolã䜿çšïŒïŒ
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a database engine with a dynamic pool size
engine = create_engine(database_url, poolclass=QueuePool, pool_size=5, max_overflow=10, pool_timeout=30)
# Create a session factory
Session = sessionmaker(bind=engine)
# Use a session to interact with the database
with Session() as session:
# Perform database operations
pass
ãã®äŸã§ã¯ã`poolclass=QueuePool`ã¯åçæ¥ç¶ããŒã«ã䜿çšããããšãæå®ããŸãã`pool_size`ã¯ããŒã«å ã®åææ¥ç¶æ°ãæå®ãã`max_overflow`ã¯äœæã§ãã远å ã®æå€§æ¥ç¶æ°ãæå®ãã`pool_timeout`ã¯æ¥ç¶ãå©çšå¯èœã«ãªããŸã§åŸ æ©ããæå€§æéãæå®ããŸãã
3. éåææ¥ç¶ããŒãªã³ã°
éåææ¥ç¶ããŒãªã³ã°ã¯ã`asyncio`ãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããéåæã¢ããªã±ãŒã·ã§ã³åãã«èšèšãããŠããŸããããã«ãããè€æ°ã®ãªã¯ãšã¹ããããããã³ã°ããããšãªãåæã«åŠçã§ããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãããã«åäžãããŸããããã¯ãWebãµãŒããŒãªã©ã®I/OããŠã³ããªã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«éèŠã§ãã
äŸïŒ`asyncpg`ã䜿çšïŒïŒ
import asyncio
import asyncpg
async def main():
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a connection pool
pool = await asyncpg.create_pool(database_url, min_size=5, max_size=20)
async with pool.acquire() as connection:
# Perform asynchronous database operations
result = await connection.fetch("SELECT 1")
print(result)
await pool.close()
if __name__ == "__main__":
asyncio.run(main())
ãã®äŸã§ã¯ã`asyncpg.create_pool`ãéåææ¥ç¶ããŒã«ãäœæããŸãã`min_size`ã¯ããŒã«å ã®æå°æ¥ç¶æ°ãæå®ãã`max_size`ã¯æå€§æ¥ç¶æ°ãæå®ããŸãã`pool.acquire()`ã¡ãœããã¯ããŒã«ããéåæã«æ¥ç¶ãååŸãã`async with`ã¹ããŒãã¡ã³ãã¯ãããã¯ãæãããšãã«æ¥ç¶ãããŒã«ã«è¿åŽãããããšãä¿èšŒããŸãã
4. æ°žç¶çæ¥ç¶
æ°žç¶çæ¥ç¶ã¯ãããŒãã¢ã©ã€ãæ¥ç¶ãšãåŒã°ãããªã¯ãšã¹ããåŠçãããåŸãéãããŸãŸã®æ¥ç¶ã§ããããã«ãããåŸç¶ã®ãªã¯ãšã¹ãã§æ¥ç¶ãå確ç«ãããªãŒããŒããããåé¿ã§ããŸããæè¡çã«ã¯æ¥ç¶*ããŒã«*ã§ã¯ãããŸããããæ°žç¶çæ¥ç¶ã¯åæ§ã®ç®æšãéæããŸãããããã¯ãã°ãã°ãåºç€ãšãªããã©ã€ããŒãORMã«ãã£ãŠçŽæ¥åŠçãããŸãã
äŸïŒ`psycopg2`ã§ããŒãã¢ã©ã€ãã䜿çšïŒïŒ
import psycopg2
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Connect to the database with keepalive parameters
conn = psycopg2.connect(database_url, keepalives=1, keepalives_idle=5, keepalives_interval=2, keepalives_count=2)
# Create a cursor object
cur = conn.cursor()
# Execute a query
cur.execute("SELECT 1")
# Fetch the result
result = cur.fetchone()
# Close the cursor
cur.close()
# Close the connection (or leave it open for persistence)
# conn.close()
ãã®äŸã§ã¯ã`keepalives`ã`keepalives_idle`ã`keepalives_interval`ãããã³`keepalives_count`ãã©ã¡ãŒã¿ãæ¥ç¶ã®ããŒãã¢ã©ã€ãåäœãå¶åŸ¡ããŸãããããã®ãã©ã¡ãŒã¿ã«ãããããŒã¿ããŒã¹ãµãŒããŒã¯ã¢ã€ãã«ç¶æ ã®æ¥ç¶ãæ€åºããŠéããããšãã§ãããªãœãŒã¹ã®æ¯æžãé²ããŸãã
Pythonã§ã®æ¥ç¶ããŒãªã³ã°ã®å®è£
ããã€ãã®Pythonã©ã€ãã©ãªã¯ãæ¥ç¶ããŒãªã³ã°ã®çµã¿èŸŒã¿ãµããŒããæäŸããŠãããã¢ããªã±ãŒã·ã§ã³ã§ã®å®è£ ã容æã«ããŠããŸãã
1. SQLAlchemy
SQLAlchemyã¯ã人æ°ã®ããPython SQLããŒã«ãããã§ããããªããžã§ã¯ããªã¬ãŒã·ã§ãã«ããããŒïŒORMïŒã§ãããçµã¿èŸŒã¿ã®æ¥ç¶ããŒãªã³ã°æ©èœãæäŸããŸããéçãåçãéåæããŒãªã³ã°ãªã©ãããŸããŸãªæ¥ç¶ããŒãªã³ã°æŠç¥ããµããŒãããŠããŸãã䜿çšããç¹å®ã®ããŒã¿ããŒã¹ãæœè±¡åãããå Žåã«é©ããéžæè¢ã§ãã
äŸïŒSQLAlchemyã§æ¥ç¶ããŒãªã³ã°ã䜿çšïŒïŒ
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a database engine with connection pooling
engine = create_engine(database_url, pool_size=10, max_overflow=20, pool_recycle=3600)
# Create a base class for declarative models
Base = declarative_base()
# Define a model class
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
# Create the table
Base.metadata.create_all(engine)
# Create a session factory
Session = sessionmaker(bind=engine)
# Use a session to interact with the database
with Session() as session:
# Create a new user
new_user = User(name="John Doe", email="john.doe@example.com")
session.add(new_user)
session.commit()
# Query for users
users = session.query(User).all()
for user in users:
print(f"User ID: {user.id}, Name: {user.name}, Email: {user.email}")
ãã®äŸã§ã¯ã`pool_size`ã¯ããŒã«å ã®åææ¥ç¶æ°ãæå®ãã`max_overflow`ã¯è¿œå ã®æå€§æ¥ç¶æ°ãæå®ãã`pool_recycle`ã¯æ¥ç¶ããªãµã€ã¯ã«ããããŸã§ã®ç§æ°ãæå®ããŸãã宿çã«æ¥ç¶ããªãµã€ã¯ã«ããããšã§ãå€ãæ¥ç¶ããªãœãŒã¹ãªãŒã¯ãªã©ãé·æéåç¶ããæ¥ç¶ã«ãã£ãŠåŒãèµ·ããããåé¡ã鲿¢ããã®ã«åœ¹ç«ã¡ãŸãã
2. Psycopg2
Psycopg2ã¯ãPythonçšã®äººæ°ã®ããPostgreSQLã¢ããã¿ã§ãããå¹ççã§ä¿¡é Œæ§ã®é«ãããŒã¿ããŒã¹æ¥ç¶ãæäŸããŸããSQLAlchemyã®ããã«*çµã¿èŸŒã¿*ã®æ¥ç¶ããŒãªã³ã°ã¯ãããŸãããã`pgbouncer`ã`psycopg2-pool`ã®ãããªæ¥ç¶ããŒã©ãŒãšçµã¿åãããŠäœ¿çšãããããšãå€ãã§ãã`psycopg2-pool`ã®å©ç¹ã¯ãPythonã§å®è£ ãããŠãããå¥ã®ããã»ã¹ãå¿ èŠãšããªãç¹ã§ããäžæ¹ã`pgbouncer`ã¯éåžžãå¥ã®ããã»ã¹ãšããŠå®è¡ãããç¹ã«å€æ°ã®çåœãªæ¥ç¶ãæ±ãå€§èŠæš¡ãªãããã€ã¡ã³ãã§ããå¹ççã§ãã
äŸïŒ`psycopg2-pool`ã䜿çšïŒïŒ
import psycopg2
from psycopg2 import pool
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a connection pool
pool = pool.SimpleConnectionPool(1, 10, database_url)
# Get a connection from the pool
conn = pool.getconn()
try:
# Create a cursor object
cur = conn.cursor()
# Execute a query
cur.execute("SELECT 1")
# Fetch the result
result = cur.fetchone()
print(result)
# Commit the transaction
conn.commit()
except Exception as e:
print(f"Error: {e}")
conn.rollback()
finally:
# Close the cursor
if cur:
cur.close()
# Put the connection back into the pool
pool.putconn(conn)
# Close the connection pool
pool.closeall()
ãã®äŸã§ã¯ã`SimpleConnectionPool`ãæå°1ã€ãæå€§10ã€ã®æ¥ç¶ãæã€æ¥ç¶ããŒã«ãäœæããŸãã`pool.getconn()`ã¯ããŒã«ããæ¥ç¶ãååŸãã`pool.putconn()`ã¯æ¥ç¶ãããŒã«ã«è¿ããŸãã`try...except...finally`ãããã¯ã¯ãäŸå€ãçºçããå Žåã§ãæ¥ç¶ãåžžã«ããŒã«ã«è¿ãããããšãä¿èšŒããŸãã
3. aiopg ãš asyncpg
éåæã¢ããªã±ãŒã·ã§ã³ã§ã¯ãPostgreSQLæ¥ç¶ã«`aiopg`ãš`asyncpg`ã人æ°ã®éžæè¢ã§ãã`aiopg`ã¯æ¬è³ªçã«`asyncio`çšã®`psycopg2`ã©ãããŒã§ããã`asyncpg`ã¯ãŒãããæžãããå®å šãªéåæãã©ã€ããŒã§ããäžè¬çã«`asyncpg`ã¯`aiopg`ãããé«éã§å¹ççã§ãããšèããããŠããŸãã
äŸïŒ`aiopg`ã䜿çšïŒïŒ
import asyncio
import aiopg
async def main():
# Database connection details
database_url = "postgresql://user:password@host:port/database"
# Create a connection pool
async with aiopg.create_pool(database_url) as pool:
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("SELECT 1")
result = await cur.fetchone()
print(result)
if __name__ == "__main__":
asyncio.run(main())
äŸïŒ`asyncpg`ãäœ¿çš - åã®ãéåææ¥ç¶ããŒãªã³ã°ãã»ã¯ã·ã§ã³ã®äŸãåç §ïŒã
ãããã®äŸã¯ã`aiopg`ãš`asyncpg`ã䜿çšããŠéåæã³ã³ããã¹ãå ã§æ¥ç¶ã確ç«ããã¯ãšãªãå®è¡ããæ¹æ³ã瀺ããŠããŸããã©ã¡ãã®ã©ã€ãã©ãªãæ¥ç¶ããŒãªã³ã°æ©èœãæäŸããŠãããéåæã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ããŒã¹æ¥ç¶ãå¹ççã«ç®¡çã§ããŸãã
Djangoã§ã®æ¥ç¶ããŒãªã³ã°
Djangoã¯ãé«ã¬ãã«ã®Python Webãã¬ãŒã ã¯ãŒã¯ã§ãããããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ã®çµã¿èŸŒã¿ãµããŒããæäŸããŠããŸããDjangoã¯`DATABASES`èšå®ã§å®çŸ©ãããåããŒã¿ããŒã¹ã«å¯ŸããŠæ¥ç¶ããŒã«ã䜿çšããŸããDjangoã¯æ¥ç¶ããŒã«ã®ãã©ã¡ãŒã¿ïŒãµã€ãºãªã©ïŒãçŽæ¥å¶åŸ¡ããæ©èœã¯å ¬éããŠããŸããããæ¥ç¶ç®¡çãééçã«åŠçãããããæç€ºçãªã³ãŒããæžããªããŠãç°¡åã«æ¥ç¶ããŒãªã³ã°ã掻çšã§ããŸãã
ãã ãããããã€ç°å¢ãããŒã¿ããŒã¹ã¢ããã¿ã«ãã£ãŠã¯ãé«åºŠãªèšå®ãå¿ èŠã«ãªãå ŽåããããŸãã
äŸïŒDjangoã®`DATABASES`èšå®ïŒïŒ
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
Djangoã¯ãããã®èšå®ã«åºã¥ããŠèªåçã«æ¥ç¶ããŒãªã³ã°ãåŠçããŸããæ¬çªç°å¢ã§æ¥ç¶ããŒãªã³ã°ãããã«æé©åããããã«ãããŒã¿ããŒã¹ã®åã«`pgbouncer`ãªã©ã®ããŒã«ã䜿çšããããšãã§ããŸãããã®å ŽåãDjangoãããŒã¿ããŒã¹ãµãŒããŒã«çŽæ¥æ¥ç¶ããã®ã§ã¯ãªãã`pgbouncer`ã«æ¥ç¶ããããã«èšå®ããŸãã
æ¥ç¶ããŒãªã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
- é©åãªæŠç¥ãéžæããïŒ ã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ãšã¯ãŒã¯ããŒãã«åã£ãæ¥ç¶ããŒãªã³ã°æŠç¥ãéžæããŸãããã©ãã£ãã¯ãã¿ãŒã³ãããŒã¿ããŒã¹ãµãŒããŒã®èœåãåºç€ãšãªãããŒã¿ããŒã¹ãã©ã€ããŒãªã©ã®èŠå ãèæ ®ããŠãã ããã
- ããŒã«ãµã€ãºã調æŽããïŒ æ¥ç¶ã®ããã«ããã¯ããªãœãŒã¹ã®ç¡é§ãé¿ããããã«ãæ¥ç¶ããŒã«ã®ãµã€ãºãé©åã«èª¿æŽããŸããã¢ã¯ãã£ããªæ¥ç¶æ°ãç£èŠããããã«å¿ããŠããŒã«ãµã€ãºã調æŽããŸãã
- æ¥ç¶å¶éãèšå®ããïŒ ãªãœãŒã¹ã®æ¯æžãé²ããå ¬å¹³ãªãªãœãŒã¹å²ãåœãŠã確ä¿ããããã«ãé©åãªæ¥ç¶å¶éãèšå®ããŸãã
- æ¥ç¶ã¿ã€ã ã¢ãŠããå®è£ ããïŒ é·æéåŸ æ©ãããªã¯ãšã¹ããä»ã®ãªã¯ãšã¹ãããããã¯ããã®ãé²ãããã«ãæ¥ç¶ã¿ã€ã ã¢ãŠããå®è£ ããŸãã
- æ¥ç¶ãšã©ãŒãåŠçããïŒ æ¥ç¶ãšã©ãŒãé©åã«åŠçããã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãé²ãããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã
- æ¥ç¶ããªãµã€ã¯ã«ããïŒ å€ãæ¥ç¶ããªãœãŒã¹ãªãŒã¯ãªã©ãé·æéåç¶ããæ¥ç¶ã«ãã£ãŠåŒãèµ·ããããåé¡ã鲿¢ããããã«ã宿çã«æ¥ç¶ããªãµã€ã¯ã«ããŸãã
- æ¥ç¶ããŒã«ã®ããã©ãŒãã³ã¹ãç£èŠããïŒ æ¥ç¶ããŒã«ã®ããã©ãŒãã³ã¹ã宿çã«ç£èŠããæœåšçãªããã«ããã¯ãåé¡ãç¹å®ããŠå¯ŸåŠããŸãã
- æ¥ç¶ãé©åã«éããïŒ ãªãœãŒã¹ãªãŒã¯ãé²ãããã«ã䜿çšåŸã¯å¿ ãæ¥ç¶ãéããïŒãŸãã¯ããŒã«ã«è¿ãïŒããã«ããŸãããããä¿èšŒããããã«`try...finally`ãããã¯ãŸãã¯ã³ã³ããã¹ããããŒãžã£ïŒ`with`æïŒã䜿çšããŸãã
ãµãŒããŒã¬ã¹ç°å¢ã§ã®æ¥ç¶ããŒãªã³ã°
æ¥ç¶ããŒãªã³ã°ã¯ãAWS LambdaãGoogle Cloud FunctionsãAzure Functionsãªã©ã®ãµãŒããŒã¬ã¹ç°å¢ã§ããã«éèŠã«ãªããŸãããããã®ç°å¢ã§ã¯ã颿°ã¯é »ç¹ã«åŒã³åºããã寿åœãçãã§ããæ¥ç¶ããŒãªã³ã°ããªããšãå颿°ã®åŒã³åºãã§æ°ããããŒã¿ããŒã¹æ¥ç¶ã確ç«ããå¿ èŠããããå€§å¹ ãªãªãŒããŒããããšã¬ã€ãã³ã·ã®å¢å ã«ã€ãªãããŸãã
ãããããããã®ç°å¢ã®ã¹ããŒãã¬ã¹ãªæ§è³ªã®ããããµãŒããŒã¬ã¹ç°å¢ã§ã®æ¥ç¶ããŒãªã³ã°ã®å®è£ ã¯å°é£ãªå ŽåããããŸãããã®èª²é¡ã«å¯ŸåŠããããã®ããã€ãã®æŠç¥ã以äžã«ç€ºããŸãã
- ã°ããŒãã«å€æ°/ã·ã³ã°ã«ãã³ïŒ 颿°ã®ã¹ã³ãŒãå ã§æ¥ç¶ããŒã«ãã°ããŒãã«å€æ°ãŸãã¯ã·ã³ã°ã«ãã³ãšããŠåæåããŸããããã«ãããåãå®è¡ç°å¢ïŒã³ãŒã«ãã¹ã¿ãŒãïŒå ã§ã®è€æ°ã®åŒã³åºãã«ããã£ãŠæ¥ç¶ããŒã«ãåå©çšã§ããŸãããã ããå®è¡ç°å¢ã¯ç Žæ£ãŸãã¯ãªãµã€ã¯ã«ãããå¯èœæ§ããããããæ¥ç¶ããŒã«ãæ°žç¶çã«ååšããããšã«äŸåããããšã¯ã§ããŸããã
- æ¥ç¶ããŒã©ãŒïŒpgbouncerãªã©ïŒïŒ `pgbouncer`ã®ãããªæ¥ç¶ããŒã©ãŒã䜿çšããŠãå¥ã®ãµãŒããŒãŸãã¯ã³ã³ããã§æ¥ç¶ã管çããŸãããµãŒããŒã¬ã¹é¢æ°ã¯ãããŒã¿ããŒã¹ã«çŽæ¥æ¥ç¶ãã代ããã«ãããŒã©ãŒã«æ¥ç¶ã§ããŸãããã®ã¢ãããŒãã¯ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåäžãããããšãã§ããŸããããããã€ã¡ã³ãã«è€éããå ãããŸãã
- ããŒã¿ããŒã¹ãããã·ãµãŒãã¹ïŒ äžéšã®ã¯ã©ãŠããããã€ããŒã¯ãæ¥ç¶ããŒãªã³ã°ããã®ä»ã®æé©åãåŠçããããŒã¿ããŒã¹ãããã·ãµãŒãã¹ãæäŸããŠããŸããããšãã°ãAWS RDS Proxyã¯Lambda颿°ãšRDSããŒã¿ããŒã¹ã®éã«äœçœ®ããæ¥ç¶ã管çããŠæ¥ç¶ãªãŒããŒããããåæžããŸãã
çµè«
Pythonã®ããŒã¿ããŒã¹æ¥ç¶ããŒãªã³ã°ã¯ãçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãæé©åããããã®éèŠãªãã¯ããã¯ã§ããæ¢åã®æ¥ç¶ãåå©çšããããšã§ãæ¥ç¶ããŒãªã³ã°ã¯æ¥ç¶ãªãŒããŒããããåæžããå¿çæéãæ¹åããã¢ããªã±ãŒã·ã§ã³ãããå€ãã®åæãªã¯ãšã¹ããåŠçã§ããããã«ããŸãããã®èšäºã§ã¯ãããŸããŸãªæ¥ç¶ããŒãªã³ã°æŠç¥ã人æ°ã®ããPythonã©ã€ãã©ãªã䜿çšããå®è·µçãªå®è£ äŸãããã³æ¥ç¶ç®¡çã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠæ¢ããŸãããæ¥ç¶ããŒãªã³ã°ã广çã«å®è£ ããããšã§ãPythonããŒã¿ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãå€§å¹ ã«åäžãããããšãã§ããŸãã
æ¥ç¶ããŒãªã³ã°ãèšèšã»å®è£ ããéã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ãããŒã¿ããŒã¹ãµãŒããŒã®èœåãåºç€ãšãªãããŒã¿ããŒã¹ãã©ã€ããŒãªã©ã®èŠå ãèæ ®ããŠãã ãããé©åãªæ¥ç¶ããŒãªã³ã°æŠç¥ãéžæããããŒã«ãµã€ãºã調æŽããæ¥ç¶å¶éãèšå®ããæ¥ç¶ã¿ã€ã ã¢ãŠããå®è£ ããæ¥ç¶ãšã©ãŒãé©åã«åŠçããŸãããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãæ¥ç¶ããŒãªã³ã°ã®å¯èœæ§ãæå€§éã«åŒãåºããå ç¢ã§ã¹ã±ãŒã©ãã«ãªããŒã¿ããŒã¹ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã